//
//  TSCMyUploadImageUtil.m
//  Tsc_IOS
//
//  Created by Rio on 15-8-30.
//  Copyright (c) 2015年 idream. All rights reserved.
//

#import "TSCMyUploadImageUtil.h"
#import "TSCMyUtil.h"
#import "TSCMyNetworkUtil.h"
#import "TSCMyHttpUtil.h"
#import "TSCMyUIUtil.h"
#import "TSCMyImageUtil.h"
#import "QiniuSDK.h"


@implementation TSCMyUploadImageUtil {
    QNUploadManager * _upManager;
    NSMutableDictionary * _picKeyDataDic; // key：待上传图片的key（一般用UIImage的%p字符串，表示该key）；value：待上传图片压缩后的NSData对象
    NSMutableDictionary * _picKeyUrlDic; // key：已上传图片的key（一般用UIImage的%p字符串，表示该key）；value：已上传图片的url
}

- (id)init {
    self = [super init];
    if (self) {
        _isCompressImage = YES; // 默认压缩后再上传
        _upManager = [[QNUploadManager alloc] init];
        _picKeyDataDic = [NSMutableDictionary dictionary];
        _picKeyUrlDic = [NSMutableDictionary dictionary];
    }
    return self;
}

- (void) startUpload_P1 {
    // 检查是否有待上传的图片路径
    NSAssert([_picKeyImageDic count] > 0, @"[E]%s: 上传图片时，不存在待上传的图片！在调起startUpload()前，请先设置_picKeyImageDic！", __FUNCTION__);
    
    // 检查待上传图片是否不为nil
    // 注：无需检查，因为dictionary中本身就不允许放nil
//    for (NSString * key in [_picKeyImageDic allKeys]) {
//        UIImage * image = [_picKeyImageDic objectForKey:key];
//        NSAssert(image != nil, @"[E]%s: 上传图片时，待上传图片[key：%@]的UIImage为nil！", __FUNCTION__, key);
//    }
    
    // 检查是否设置了监听者
    // IOS：do nothing
    
    // 检查网络是否可用
    if([TSCMyNetworkUtil checkNetwork] == false) {
        NSLog(@"[W]%s: 上传图片时，网络不可用！", __FUNCTION__);
        return;
    };
    
    
    [self uploadImg_P1];
}

- (void) uploadImg_P1 {
    // 首先获得七牛token
    [TSCMyHttpUtil getWithUrl:URL_GET_PIC_SERVER_TOKEN completionHandler:^(ServerRespType serverRespType, NSString *resp) {
        // 服务器返回错误处理
        switch (serverRespType) {
            case ServerRespTypeSuccess:
                break;
            case ServerRespTypeErrNil:
            default:
                dispatch_async(dispatch_get_main_queue(), ^{
                    [TSCMyUIUtil popErrWithResourceKey:@"err_web_server_unavailable"];
                });
                return;
        }
        
        // 继续后续逻辑...
        [self uploadImg_P2:resp];
    }];
}

- (void) uploadImg_P2:(NSString *)serverRespMsg {
    // 解析token，就是服务器全部返回内容
    NSString * token = serverRespMsg;
    
    // 本次上传过程中，已经上传了多少张图片
    __block NSUInteger howManyImgNow = 0;
    NSUInteger totalImgNum = [_picKeyImageDic count];
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
        // 对所有待上传图片创建缩略图，并保存下来备用
        if (_isCompressImage) {
            for (NSString * key in [_picKeyImageDic allKeys]) {
                UIImage * image = [_picKeyImageDic objectForKey:key];
                
                // 创建缩略图
                NSData * thumbnail = [TSCMyImageUtil getThumbnailWithOriginalImage_1:image];
                
                // 放入dic备用
                [_picKeyDataDic setObject:thumbnail forKey:key];
            }
        }
        // 直接上传原图，不压缩
        else {
            for (NSString * key in [_picKeyImageDic allKeys]) {
                UIImage * image = [_picKeyImageDic objectForKey:key];
                
                // 创建原图
                // 注：即便为1.0f，产生的NSData将比原图还大！
                NSData * original = UIImageJPEGRepresentation(image, 1.0f);
                
                // 放入dic备用
                [_picKeyDataDic setObject:original forKey:key];
            }
        }
        
        // 上传图片
        dispatch_async(dispatch_get_main_queue(), ^{
            
            for (NSString * key in [_picKeyDataDic allKeys]) {
                NSData * data = [_picKeyDataDic objectForKey:key]; // 图片数据
                NSString * picName0 = nil; // 上传到图片服务器后图片的名称，如果给nil，则由图片服务器自行命名（但不能传入@""！）
                // 注：选项中的mime类型填错的话，可能导致图片无法在七牛正常浏览
                QNUploadOption * opt = [[QNUploadOption alloc]initWithMime:@"image/jpeg" progressHandler:^(NSString *picName, float percent) {
                    if (_onProgress) {
                        _onProgress(picName, percent);
                    }
                } params:@{@"x:imgKey":key} checkCrc:YES cancellationSignal:nil];
                
                [_upManager putData:data key:picName0 token:token complete: ^(QNResponseInfo *info, NSString *picName, NSDictionary *respDic) {
                    if (info.error) {
                        NSLog(@"[E]%s: 上传图片时，图片服务器返回错误！错误信息：%@", __FUNCTION__, info.error);
                        
                        // 失败回调
                        if (_onFailure) {
                            _onFailure(info.error);
                            return;
                        }
                    } else {
                        // 获取已上传图片的相关信息
                        NSString * hash = [respDic objectForKey:@"hash"];
                        NSString * imgUrl = [NSString stringWithFormat:@"%@/%@", URL_QINIU_PIC_SERVER_PUB_URL, [TSCMyUtil isStringEmpty:picName] ? hash : picName]; // 注：如果自定义了图片名称，则图片url不再从hash中获取
                        NSString * imgKeyStr = [respDic objectForKey:@"x:imgKey"];
                        
                        
                        // 更新已经成功上传图片的数量
                        howManyImgNow += 1;
                        
                        // 保存已上传图片的url
                        // 注：setValueAt()不会更新SA的size。对于index位置本身就存在value的情况，使用setValueAt()没有任何问题；但对于index位置没有value的情况，使用后会导致SA.size()没有变化
                        [_picKeyUrlDic setObject:imgUrl forKey:imgKeyStr];
                        
                        // 调用“每”上传一张图片都要进行的回调
                        if (_onSuccessOne) {
                            _onSuccessOne(imgKeyStr, imgUrl);
                        }
                        
                        // 当所有图片都成功上传后，再继续后续处理
                        if (howManyImgNow == totalImgNum) {
                            if (_onSuccessAll) {
                                _onSuccessAll (_picKeyUrlDic);
                            }
                        }
                    }
                } option:opt];
            }
        });
    });
}

@end
